#include "KEY.h"

//按键及其外部中断测试程序              修改日期：2025/5/28
//实现功能：轮询读取按键
//					外部中断读取按键
//By:TAO XIN YU (陶鑫宇)


//初始化KEY
//无参
//无返回值
void KEY_init(void)
{
	//开启KEY时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	//配置KEY电气属性 上拉输入
	gpio_mode_set(KEY1_GPIOX,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,KEY1_PIN);
		
}

//阻塞式获取按键（轮询）
//无参
//返回值：key 键码值 （范围0~255）
unsigned char KEY_read_value(void)
{
	//定义键码值范围（0~255）
	unsigned char key=0;
	//判断KEY1按键是否被按下，变为低电平
	if(!KEY1_READ())
	{
		//消除机械回弹抖动
		delay_1ms(20);
		//松手检测
		while(gpio_input_bit_get(KEY1_GPIOX,KEY1_PIN) == 0);
		//消除机械回弹抖动
		delay_1ms(20);
		//键码值为1
		key=1;
	}	
	//返回键码
	return key;
}

//初始化KEY_EXTI
//无参
//无返回值
void KEY_EXTI_init(void)
{
	//使能CFGCMP时钟
	rcu_periph_clock_enable(RCU_CFGCMP);
	//NVIC中断使能 并指定中断优先级
	nvic_irq_enable(KEY1_EXTI_irqn,KEY1_IRQ_priority);
	//配置KEY1中断设置 外部中断 下降沿触发
	exti_init(KEY1_EXTI_LINEX,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
	//清除KEY1 中断标志位
	exti_interrupt_flag_clear(KEY1_EXTI_LINEX);
	
}

void EXTI2_3_IRQHandler(void)
{
	//判断是否是来自KEY1的中断
	if(RESET != exti_interrupt_flag_get(KEY1_EXTI_LINEX))
	{
		//LED1状态反转
		LED1_TOGGLE();
		//清除中断标志位
		exti_interrupt_flag_clear(KEY1_EXTI_LINEX);
	}
}

